package utils

import (
	"fmt"
	"github.com/mitchellh/mapstructure"
	"reflect"
	"strings"
)

// ConversionStructForProto 通过mapstructure库根据 proto 标签映射转换结构体
func ConversionStructForProto(source, destination interface{}) error {
	if source == nil {
		return nil
	}

	// 获取目标值的反射对象并确保它是可设置的结构体指针
	destVal := reflect.ValueOf(destination)
	if destVal.Kind() != reflect.Ptr || destVal.Elem().Kind() != reflect.Struct {
		return fmt.Errorf("destination must be a pointer to a struct")
	}

	// 使用 mapstructure 进行解码
	decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
		Result:           destination,
		TagName:          "proto", // 指定使用的标签名
		WeaklyTypedInput: true,    // 允许弱类型转换（如字符串"123"->数字123）
	})

	if err != nil {
		return fmt.Errorf("failed to create decoder: %w", err)
	}

	return decoder.Decode(source)
}

// ConversionStructForJson 通过mapstructure库根据 json 标签映射转换结构体
func ConversionStructForJson(source, destination interface{}) error {
	if source == nil {
		return nil
	}

	// 获取目标值的反射对象并确保它是可设置的结构体指针
	destVal := reflect.ValueOf(destination)
	if destVal.Kind() != reflect.Ptr || destVal.Elem().Kind() != reflect.Struct {
		return fmt.Errorf("destination must be a pointer to a struct")
	}

	// 使用 mapstructure 进行解码
	decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
		Result:           destination,
		TagName:          "json", // 指定使用的标签名
		WeaklyTypedInput: true,   // 允许弱类型转换（如字符串"123"->数字123）
	})

	if err != nil {
		return fmt.Errorf("failed to create decoder: %w", err)
	}

	return decoder.Decode(source)
}

func StringToStringArray(str string) []string {
	return strings.Split(str, ",")
}

func StringArrayToString(strArray []string) string {
	var str string

	for _, s := range strArray {
		if str == "" {
			str = s
		} else {
			str = fmt.Sprintf("%s,%s", str, s)
		}
	}
	return str
}
